public class Practice {

    public int a = 10;
    public int b = 20;

    public static void main5(String[] args) {
        Dog d1 = new Dog("hehe",3,2000);
        //d1.setDog2("haha",10,1000);
        d1.eat();
        System.out.println(d1.name);
        System.out.println(d1.price);
        System.out.println(d1.age);
    }

//    public static void test() {
//        test();
//    }
    public static void main3(String[] args) {
       // test();
    }
    public static void main2(String[] args) {
        Dog d1 = new Dog("hehe",3,2000);
        //d1.setDog2("haha",10,1000);
        d1.eat();
        System.out.println(d1.name);
        System.out.println(d1.price);
        System.out.println(d1.age);
    }
    public static void main1(String[] args) {
        String[] str = {"lisi","zhangsan"};
        Student s1 = new Student();
        s1.name = "zhangsan";
        s1.age = 20;
        System.out.println(s1.name);
        System.out.println(s1.age);
        s1.play();
        //s1.main("zhangsan");
        s1.main(str);
    }

}

class Student {
    public String name;
    public int age;
    public int score;

    public void eat() {
        System.out.println(name+"eating");
    }

    public void play() {
        System.out.println("playing");
    }

    public void read() {
        System.out.println("reading");
    }

    public static void main(String args[]) {
        Practice p1 = new Practice();
        System.out.println(p1.a);
        System.out.println(p1.b);

    }

}
//一个Java文件只能有一个public修饰的类，而且类名必须和文件名一致，但是一个Java文件内可以有多个类。
//一个类可以定义一个主函数，也可以没有主函数，public修饰的类里面也可以没有主函数，但是一个Java文件中一定要有一个主函数，不然文件没有运行入口
//可以在非public修饰的类中创建public修饰的类的对象，还能调用对象的主函数
class Dog {
    String name;
    int age;
    int price;

    public void setDog1(String name,int age,int price) {
        name = name;
        age = age;
        price = price;
    }
    public void setDog2(String name,int age,int price) {
        this.name = name;
        this.age = age;
        this.price = price;
    }

    public void play() {
        System.out.println("play");
        this.eat();
    }
    public void eat() {
        System.out.println("eat");
//      this.eat();
    }
    public void sleep() {
        System.out.println("sleep");
    }
    public Dog() {
        this("哈哈",2,1000);
        System.out.println("无参构造");

    }

    public Dog(String name,int age,int price) {
        this.name = name;
        this.age = age;
        this.price = price;
        System.out.println("三参构造");
        this.setDog2("haha",100,12);
    }


}

//this引用指向当前对象（成员方法运行时调用该成员方法的对象）。在成员方法中所有成员变量的操作，都是通过该引用去访问的。

//1.this引用  this引用构造函数 --->只能在构造函数内部调用构造函数，而且调用的构造函数必须在代码第一句
//2.this调用成员变量  当成员变量和形参名相同，此时局部变量优先。
// 此时方法内部的两个name都是形参的name，没有引用到对象的，因此无法改变对象的name
//
//    public void setDog(String name,int age,int price) {
//        name = name;
//        age = age;
//        price = price;
//    }
//此处的this是方法的隐式参数，在类定义的每个成员方法中，都有一个隐式参数，该隐式参数的类型是该类的类型，参数名是this
//因此在调用在方法时，编译器会默认帮我们把对象的引用变量作为参数传递给方法，因此可以通过this.成员变量访问该对象的成员变量

//    public void setDog(String name,int age,int price) {
//        this.name = name;
//        this.age = age;
//        this.price = price;
//    }
//3.this引用成员方法
//成员方法之间可以通过this互相引用,方法自身通过this调用自身如果没有限制条件，可能会造成死递归
//构造方法可以通过this引用对象的成员方法